package br.com.pi.SmartFast.controler;

import br.com.pi.SmartFast.model.FormatoDeNumeros;
import br.com.pi.SmartFast.model.Itens;
import br.com.pi.SmartFast.model.ItensDAO;
import br.com.pi.SmartFast.model.ItensProduto;
import br.com.pi.SmartFast.model.ItensProdutoDAO;
import br.com.pi.SmartFast.model.Produto;
import br.com.pi.SmartFast.model.ProdutoDAO;
import br.com.pi.SmartFast.model.TipoProduto;
import br.com.pi.SmartFast.model.TipoProdutoDAO;
import java.awt.Image;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Alessandro
 */
public class ControleTelaCadastroProduto {

    // Declaração de variáveis para a tela cadastro de produtos
    private JButton bt_editar, bt_imagem, bt_localizar_imagem, bt_localizar_item, bt_sair, bt_salvar, bt_sair_itens;
    private JCheckBox chbox_ativo;
    private JComboBox combo_tipo_produto;
    private JTable tab_produtos;
    private JTextField txt_codigo, txt_custo, txt_estoque, txt_nome_produto, txt_venda;
    private JDialog jd_imagem, jd_itens_produto;
    private JFileChooser jfc_imagem;
    private JFrame tela;
    private JLabel lbl_fotoItens, lbl_nome_produto;
    private JList jlist_itens_produto, jlist_itens;
    private DefaultListModel model_itens = new DefaultListModel();
    private DefaultListModel model_itens_produto = new DefaultListModel();
    private ResultSet rs = null;
    private ProdutoDAO dao = new ProdutoDAO();
    private Produto prodGeral = null;
    private String urlImagem = "";
    private List<TipoProduto> listaTipoProduto = new ArrayList<TipoProduto>();
    private JRadioButton sobremesa, salgados, todos, bebidas;

    /** Método construtor da classe controleTelaCadastroProduto
     *
     */
    public ControleTelaCadastroProduto() {
    }

    public ControleTelaCadastroProduto(JButton bt_editar, JButton bt_imagem,
             JButton bt_localizar_item, JButton bt_sair,
            JButton bt_salvar, JCheckBox chbox_ativo, JComboBox combo_tipo_produto,
            JTable tab_produtos, JTextField txt_codigo, JTextField txt_custo,
            JTextField txt_estoque, JTextField txt_nome_produto, JTextField txt_venda, JDialog jd_imagem,
            JFileChooser jfc_imagem, JFrame tela, JDialog jd_itens_produto, JLabel lbl_fotoItens, JLabel lbl_nome_produto, JList jlist_itens_produto, JList jlist_itens, JButton bt_sairItens,
            JRadioButton sobremesa, JRadioButton salgado, JRadioButton todos, JRadioButton bebidas) {
        this.bebidas = bebidas;
        this.lbl_fotoItens = lbl_fotoItens;
        this.lbl_nome_produto = lbl_nome_produto;
        this.jlist_itens = jlist_itens;
        this.jlist_itens_produto = jlist_itens_produto;
        this.bt_sair_itens = bt_sairItens;
        this.bt_editar = bt_editar;
        this.bt_imagem = bt_imagem;        
        this.bt_localizar_item = bt_localizar_item;
        this.bt_sair = bt_sair;
        this.bt_salvar = bt_salvar;
        this.chbox_ativo = chbox_ativo;
        this.combo_tipo_produto = combo_tipo_produto;
        this.tab_produtos = tab_produtos;
        this.txt_codigo = txt_codigo;
        this.txt_custo = txt_custo;
        this.txt_estoque = txt_estoque;
        this.txt_nome_produto = txt_nome_produto;
        this.txt_venda = txt_venda;
        this.jd_imagem = jd_imagem;
        this.jfc_imagem = jfc_imagem;
        this.tela = tela;
        this.jd_itens_produto = jd_itens_produto;
        this.sobremesa = sobremesa;
        this.salgados = salgado;
        this.todos = todos;
    }

    /**Método destinado a salvar o produto no banco de dados
     *
     */
    public void botaoSalvar() {

        try {
            //verifica se os campos obrigatórios estão preenchidos - true grava no banco//false - exibe mensagem e não grava
            if (this.getCamposObrigatorios()) {
                this.dao.gravaProduto(this.setPovoarProduto());//objeto dao para gravar no banco e método que retorna um objeto Produto
                this.prodGeral = this.setPovoarProduto();
                this.setabreFrameGravarItens();
                this.setLimpaTexto();//limpa os campos para novo cadastro
                this.txt_codigo.setText(Integer.toString(this.getCodigoProduto()));//lança novo código para novo cadastro
                this.setPreencheTabela();//consulta o banco e preenche a tabela com registros existentes

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "ERRO AO SALVAR!!!:", "Erro de gravação", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**Método destinado a fechar a tela em uso
     * 
     */
    public void botaoSair() {        
        tela.setVisible(false);  
            
    }
    /** Método destinado a fechar tela de cadastro de itens
     * 
     */
    public void botaoSairItens(){
        this.jd_itens_produto.setVisible(false);
    }

    /**Método para seleciona a imagem e inseri-la no botão imagem da tela
     *
     */
    public void botaoAbrirImagem() {

        this.urlImagem = jfc_imagem.getSelectedFile().getAbsolutePath();//caminho da imagem
        this.bt_imagem.setText("");//retira o texto do botão imagem
        this.bt_imagem.setIcon(new ImageIcon(this.urlImagem));//insere a imagem no botão
        this.jd_imagem.setVisible(false);     // desabilita a JDialog

    }

    /** Botão para abrir caixa de dialogo e procurar arquivos de imagem
     *
     */
    public void botaoLocalizarImagem() {

        this.jd_imagem.setVisible(true);
        this.jfc_imagem.setSelectedFile(null);

    }

    @SuppressWarnings("static-access")
    public void setAoAbrirTela() {

        this.tela.setExtendedState(tela.MAXIMIZED_BOTH);
        this.setPreencheComboTipoProduto();
        this.txt_codigo.setText(Integer.toString(this.getCodigoProduto()));
        this.setPreencheTabela();
        this.txt_codigo.setEnabled(false);
        this.bt_editar.setEnabled(false);
        this.bt_localizar_item.setEnabled(false);
        this.chbox_ativo.setSelected(true);

    }

    /** Retorna verdadeiro se o nome do produto estiver registrado no banco de dados
     *
     * @return
     * @throws SQLException
     */
    private boolean getNomeProdutoCadastro() {

        try {
            rs = dao.getDadosTabela("SELECT nome FROM produtos WHERE nome = '" + this.txt_nome_produto.getText() + "'");

            if (rs.next()) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }

    /**Método utilizado para obter informações da tela e formar o objeto produto
     * 
     * @return
     */
    private Produto setPovoarProduto() {

        Produto pdt = new Produto();  //inicializa o objeto

        pdt.setCodigo_prod(Integer.parseInt(this.txt_codigo.getText()));//resgata o código da tela
        pdt.setNome(this.txt_nome_produto.getText());//resgata o nome da tela
        pdt.setVenda(Float.parseFloat(this.txt_venda.getText().replace(",", ".")));//resgata o valor da venda da tela
        pdt.setCusto(Float.parseFloat(this.txt_custo.getText().replace(",", ".")));//gesgata o valor de custo da tela
        pdt.setUrl_imagem(this.urlImagem);//recebe a url da imagem através da variável urlImagem
        pdt.setDisponivel(this.getProdutoDisponivel());// o método retorna v/f para saber se o produto está disponível
        pdt.setEstoque(Integer.parseInt(this.txt_estoque.getText()));//recebe o estoque da tela
        pdt.setTipo_produto(this.getTipoProduto(this.combo_tipo_produto.getSelectedItem().toString()));
        //esta linha acima seta o tipo de produto (prato,sobremesa,bebida) do produto que está sendo gravado.
        //a função getTipoProduto necessita do tipo de produto selecionado no combo da tela para pesquisar no banco mysql
        // e retornar um objeto TipoProduto para compor o objeto Produto...
        // maiores informações ligue (48)9981 9610...rsrsrsrsv

        return pdt;//retorna o objeto produto povoado

    }

    /**Método para selecionar se o produto está a venda ou não...
     *
     * @return
     */
    private boolean getProdutoDisponivel() {

        if (this.chbox_ativo.isSelected()) {
            return true;
        } else {
            return false;
        }
    }

    /** Método que verifica os caqmpos obrigatórios
     *
     * @return
     */
    private boolean getCamposObrigatorios() {

        if (this.txt_nome_produto.getText().equalsIgnoreCase("")) {
            JOptionPane.showMessageDialog(null, "Produto não possui nome");
            return false;
        } else {
            if (this.txt_venda.getText().equalsIgnoreCase("")) {
                JOptionPane.showMessageDialog(null, "Produto não possui valor de venda");
                return false;
            } else {
                if (this.getNomeProdutoCadastro()) {
                    JOptionPane.showMessageDialog(null, "Produto possui cadastro no banco!!", "Consulta Banco Dados", JOptionPane.INFORMATION_MESSAGE);
                    return false;
                } else {
                    return true;
                }
            }
        }
    }

    /**Método para limpar tela
     *
     */
    private void setLimpaTexto() {
        this.txt_nome_produto.setText("");
        this.txt_codigo.setText("");
        this.txt_custo.setText("");
        this.txt_estoque.setText("");
        this.txt_venda.setText("");
        this.urlImagem = "";
        this.bt_imagem.setIcon(null);
        this.bt_imagem.setText("Imagem Produto");
    }

    /**Método para inserir tipos de produto no combo tipo de produto
     * 
     * @throws SQLException
     */
    private void setPreencheComboTipoProduto() {

        try {
            // variavel rs recebe a consulta sql do banco...
            this.rs = new TipoProdutoDAO().getDadosTipoProduto("SELECT  * FROM TIPO_PRODUTO ORDER BY ID_TIPO_PRODUTO");

            if (rs.next()) {//se a consulta contiver dados...
                do {//inicia o laço para percorrer a consulta ...
                    this.combo_tipo_produto.addItem(rs.getString("nome"));// o combo recebe os registros da consulta

                } while (rs.next());//enquanto houver uma linha seguinte para percorrer
            }

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "ERRO : " + e, "Erro de entrada", JOptionPane.ERROR_MESSAGE);
        }
    }

    /** Método retorna o próximo código do produto para cadastro
     *
     * @return
     */
    private int getCodigoProduto() {
        try {
            rs = dao.getDadosTabela("Select id_produtos from produtos");//pesquisa no banco os códigos do produto cadastrados
            if (rs.last()) {//se existir registros , move-se para o ultimo registro
                return rs.getInt("id_produtos") + 1;//retorna o valor do ultimo registro + 1
            } else {//senão retornará 1
                return 1;
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possível carregar o código do produto", "Código Produto", JOptionPane.ERROR_MESSAGE);
            return 0;
        }
    }

    /** Função para retornar um Tipo de produto
     *
     */
    private TipoProduto getTipoProduto(String tipo_produto) {

        TipoProduto tp = null;//iniciali-za o objeto tp da classe TipoProduto
        try {
            rs = dao.getDadosTabela("SELECT * FROM TIPO_PRODUTO WHERE NOME LIKE '" + tipo_produto + "'");//pesquisa no banco usando a referência tipo_produto

            if (rs.next()) {//Se retornar um registro da consulta(este registro deve ser unico)
                tp = new TipoProduto(rs.getInt("id_tipo_produto"), rs.getString("nome"));//tp recebe parâmetros do banco
            }
        } catch (Exception e) {
        }

        return tp;//retorna o  objeto tp

    }

    /** Método destinado a inserir itens na tabela de cadastro de produtos
     * 
     */
    private void setPreencheTabela() {

        int r = 0;       //variavel para incrementar linhas da tabela

        for (int i = 0; i < this.tab_produtos.getRowCount(); i++) {//usado para remover dados da tabela
            for (int b = 0; b < this.tab_produtos.getColumnCount(); b++) {//para inserir novos dados
                this.tab_produtos.setValueAt("", i, b);
            }
        }

        //instrução sql que fará a pesquisa no banco
        String sql = "SELECT PD.ID_PRODUTOS,PD.NOME,PD.VALOR_VENDA,PD.PROD_AVENDA,TP.NOME AS TIPO  "
                + "FROM PRODUTOS AS PD,TIPO_PRODUTO AS TP "
                + "WHERE PD.FK_TIPO_PRODUTO = TP.ID_TIPO_PRODUTO";


        try {//rs recebe pesquisa do banco para inserir na tabela
            rs = dao.getDadosTabela(sql);
            if (rs.next()) {//se existirem registros
                do {
                    if(tab_produtos.getRowCount()==r){
                        ((DefaultTableModel)tab_produtos.getModel()).addRow(new Vector());
                    }
                    this.tab_produtos.setValueAt(rs.getString("tipo"), r, 0);//tipo de produto
                    this.tab_produtos.setValueAt(rs.getInt("id_produtos"), r, 1);//código produto
                    this.tab_produtos.setValueAt(rs.getString("nome"), r, 2);//nome do produto
                    this.tab_produtos.setValueAt(new FormatoDeNumeros(rs.getFloat("valor_venda")).getValorMonetario(), r, 3);//valor de venda
                    if(rs.getBoolean("prod_avenda")){
                      this.tab_produtos.setValueAt("Ativo", r++, 4);//disponível ou não
                    }else{
                         this.tab_produtos.setValueAt("Inativo", r++, 4);//disponível ou não
                    }
                    
                } while (rs.next());
            }
        } catch (SQLException ex) {
        }
    }

    /**Método destinado a pedir a opção de gravar ou não itens no produto
     *
     */
    public void setabreFrameGravarItens() {

        int indice = JOptionPane.showConfirmDialog(null, "Deseja gravar itens para este produto ?", "Itens do produto", JOptionPane.OK_CANCEL_OPTION);

        switch (indice) {
            case 0:
                jd_itens_produto.setVisible(true);//abre a janela para INSERIR itens no produto
                this.setAoAbrirJanelaItensProduto(this.setPovoarProduto());
                break;
            default:
                this.txt_nome_produto.requestFocus();//seta o foco no jtextfield produto
                break;
        }

    }

    /**Método para inicializar a janela de cadastro deitens do produto
     *
     * @param prod
     */
    private void setAoAbrirJanelaItensProduto(Produto prod) {

        this.lbl_nome_produto.setText(prod.getNome());//atribui nome ao produto
        this.lbl_fotoItens.setIcon(new ImageIcon(prod.getUrl_imagem()));//imagem produto
        this.lbl_fotoItens.setText(null);//desabilita o texto
        this.sobremesa.setSelected(true);//seleciona sobremesa como default
        this.getItensProduto();//chama método
        this.getProdutoItem();//chama método
    }

    /**Método que seleciona os itens para cadastro do produto e itens
     *
     */
    public void getItensProduto() {

        int item = 0;//base de consulta para sobremesa,salgado,bebidas
        ResultSet lista = null;//recebe a consulta sql
        ItensDAO idao = new ItensDAO();//objeto do BD para gravação/consulta
        String sql = "";//instrução sql

        if (sobremesa.isSelected()) {//verifica o radio selecionado
            item = 1;
        } else {
            if (salgados.isSelected()) {
                item = 2;
            } else {
                if (bebidas.isSelected()) {
                    item = 3;
                } else {
                    item = 0;
                }
            }
        }

        this.model_itens.clear();//limpa o model
        this.jlist_itens.removeAll();//limpa a lista

        if (item > 0) {//se item for maior que zero, relaciona o item específico
            sql = "select nome "
                    + " from itens"
                    + " where fk_doce_salgado = " + item + " and"
                    + " id_itens not in"
                    + " (select fk_id_itens from itens_produto"
                    + " where fk_id_produtos = " + this.prodGeral.getCodigo_prod() + ")order by nome";

            lista = idao.getDadosTabela(sql);//recebe a consulta sql
            try {
                if (lista.next()) {//move para primeira tupla
                    do {
                        this.model_itens.addElement(lista.getString("nome"));//adiciona nome ao model
                    } while (lista.next());
                    this.jlist_itens.setModel(model_itens);//adiciona model a lista
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);//trata erro
            }
        } else {//se item for zero relaciona todos os itens de produto
            sql = "select nome "
                    + " from itens"
                    + " where "
                    + " id_itens not in"
                    + " (select fk_id_itens from itens_produto"
                    + " where fk_id_produtos = " + this.prodGeral.getCodigo_prod() + ")order by nome";
            lista = idao.getDadosTabela(sql);
            try {
                if (lista.next()) {
                    do {
                        this.model_itens.addElement(lista.getString("nome"));
                    } while (lista.next());
                    this.jlist_itens.setModel(model_itens);
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e + "itens");
            }
        }
    }

    /**Método destinado a relacionar os itens cadastrados para o produto selecionado
     *
     * @param prod
     */
    private void getProdutoItem() {

        ItensDAO idao = new ItensDAO();//objeto para consulta no banco
        this.model_itens_produto.clear();//limpa o modelo de lista
        this.jlist_itens_produto.removeAll();//limpa a lista

        try {
            String sql = "SELECT IT.NOME as nome" +//instrução sql de consulta ao banco
                    " FROM ITENS AS IT , ITENS_PRODUTO AS IP"
                    + " WHERE IT.ID_ITENS = IP.FK_ID_ITENS AND"
                    + " IP.FK_ID_PRODUTOS = " + this.prodGeral.getCodigo_prod()+ " order by nome ";//parametro

            this.rs = idao.getDadosTabela(sql);//rs recebe a consulta

            if (rs.next()) {//se existir informação
                do {
                    this.model_itens_produto.addElement(rs.getString("nome"));//adiciona o nome ao model
                } while (rs.next());
                this.jlist_itens_produto.setModel(model_itens_produto);//adiciona o model a lista
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e + "produto");//trata erro
        }
    }

    /**Método destinado a cadastrar itens ao produto
     *
     * @param valor
     */
    public void setAoClicarJListItem(int valor) {

        if (valor == 2) {//se for clicado duas vezes no jlist itens

            ItensProduto ip = new ItensProduto();//objeto itens do produto
            ItensProdutoDAO idao = new ItensProdutoDAO();//objeto dao para gravar no banco
            Produto pd = new Produto();//objeto produto

            try {
                String item = this.jlist_itens.getSelectedValue().toString();//recebe valor clicado no list
                Itens it = new Itens();//objeto itens
                ItensDAO id = new ItensDAO();//objeto dao para consulta no banco
                ResultSet r = null;
                String sql = "select id_itens,nome from itens where nome like '" + item + "'";//inst. de consulta
                r = id.getDadosTabela(sql); //r recebe a consulta
                if (r.next()) {//se houverem tuplas
                    it.setId_itens(r.getInt("id_itens"));//set id item
                    it.setNome(r.getString("nome"));// set nome item
                }

                String produto = this.lbl_nome_produto.getText();   //recebe o nome do produto
                ProdutoDAO pdd = new ProdutoDAO();//objeto dao para consulta ao banco
                ResultSet p = null;
                sql = "select id_produtos,nome from produtos where nome like '" + produto + "'";//inst. sql
                p = pdd.getDadosTabela(sql);//recebe a consulta
                if (p.next()) {//se houverem tuplas
                    pd.setNome(p.getString("nome"));//set nome produto
                    pd.setCodigo_prod(p.getInt("id_produtos"));//set codigo produto
                }

                ip.setItem(it);// objeto ip recebe objeto it
                ip.setProduto(pd);//objeto ip recebe objeto pd
                idao.setGravaItensProduto(ip);//objeto idao grava informações no banco
            } catch (Exception e) {
            }
            this.getItensProduto();//chama método
            this.getProdutoItem();//chama método
        }
    }

    public void setAoClicarJListItensProduto(int clique) {

        if (clique == 2) {
            int cod=0;
            try {
                ItensProdutoDAO ip = new ItensProdutoDAO();
                String item = this.jlist_itens_produto.getSelectedValue().toString();                
                String prod = this.lbl_nome_produto.getText();

                this.rs = ip.getItensProduto("select ip.id_itens_produto " +
                        " from itens_produto as ip , produtos as pd , itens as it" +
                        " where pd.id_produtos = ip.fk_id_produtos and" +
                        " ip.fk_id_itens = it.id_itens and" +
                        " pd.nome like '" + prod + "' and" +
                        " it.nome like '" + item + "' ") ;
                if(rs.next()){
                    cod = rs.getInt("id_itens_produto");
                }

                String sql = "delete from itens_produto where id_itens_produto =" + cod;

                ip.setExcluiItensProduto(sql);

                this.getItensProduto();
                this.getProdutoItem();
            } catch (Exception e) {
                System.out.println(e);
            }            
        }


    }

    /** Método para editar produtos no banco de dados
     *
     */
    public void botaoEditar(){
        this.prodGeral = this.setPovoarProduto();
        this.dao.EditarProdutos(prodGeral);
        this.setPreencheTabela();
        this.bt_editar.setEnabled(false);
        this.bt_localizar_item.setEnabled(false);
        this.bt_salvar.setEnabled(true);
        this.setLimpaTexto();
        this.txt_codigo.setText(Integer.toString(this.getCodigoProduto()));

    }

    /** Método destinado a consultar o produto selecionado no banco de dados
     *
     * @param clique
     */
    public void duploCliqueTabelaProdutos(int clique){

        if(clique == 2){//se derem um duplo clique
            //variavel recebe o código do produto selecionado
            String codprod = this.tab_produtos.getValueAt(this.tab_produtos.getSelectedRow(), 1).toString();
            //consulta no banco
            String sql = "select pd.*,tp.nome as nometp " +
                    " from produtos as pd,tipo_produto as tp" +
                    " where id_produtos = ' " + codprod + " ' and" +
                    " pd.fk_tipo_produto = tp.id_tipo_produto";
           //consulta no banco
            try{
            this.rs = dao.getDadosTabela(sql);
            //se existirem registros
            if(this.rs.next()){
                this.combo_tipo_produto.setSelectedItem(rs.getString("nometp"));
                this.txt_codigo.setText(Integer.toString(rs.getInt("id_produtos")));
                this.txt_nome_produto.setText(rs.getString("nome"));
                this.txt_custo.setText(Float.toString(rs.getFloat("valor_custo")));
                this.txt_venda.setText(Float.toString(rs.getFloat("valor_venda")));
                this.txt_estoque.setText(Integer.toString(rs.getInt("estoque")));
                boolean op = rs.getBoolean("prod_aVenda");
                if(op){
                    this.chbox_ativo.setSelected(true);
                }else{
                    this.chbox_ativo.setSelected(false);
                }
                if(rs.getBytes("foto") != null){
                Image im = new ImageIcon(rs.getBytes("foto")).getImage();
                this.bt_imagem.setIcon(new ImageIcon(im));
                this.bt_imagem.setText("");
                this.urlImagem = rs.getString("url");
                }

                this.bt_editar.setEnabled(true);
                this.bt_localizar_item.setEnabled(true);
                this.bt_salvar.setEnabled(false);

                this.prodGeral=this.setPovoarProduto();
                
            }
            }catch(Exception e){
                JOptionPane.showMessageDialog(null, "Acesso ao banco negado!!!");
            }

        }
    }

    public void botaoItens(){

        this.jd_itens_produto.setVisible(true);
       this.setAoAbrirJanelaItensProduto(this.prodGeral);
    }


}
